package br.com.imob.dao;

import br.com.imob.modelo.Endereco;

import java.util.HashSet;
import java.util.List;



public class EnderecoDao extends GenericDao {

	public EnderecoDao() {
    }

    public Integer adicionarEndereco(Endereco endereco) {
        new BairroDao().adicionarBairro(endereco.getBairro());
        saveOrUpdatePojo(endereco);
        return endereco.getEnderecoId();
    }

    /**
     * Adiciona uma instancia no banco de dados e retorna a instancia
     * adicionada Endereco.
     * @param endereco Endereco
     * @see ClienteDao()#atualizarCliente(nettran.entidade.Cliente(), nettran.entidade.Cliente())
     * @return Endereco
     */
    public Endereco addEndereco(Endereco endereco) {
        new BairroDao().adicionarBairro(endereco.getBairro());
        saveOrUpdatePojo(endereco);
        return endereco;
    }

    public void removerEndereco(Endereco endereco) {
        removerPojo(endereco);
    }

    /* Precisa definir o ID */
    public void atualizarEndereco(Endereco recupera) {
        saveOrUpdatePojo(recupera);
    }
    
    /**
	 * Editar um Endereco
	 * @param String oldEndereco
	 * @param String newEndereco
	 */
	public void atualizarEndereco(String oldEndereco, String newEndereco ) {
		if ( ( !"".equals(oldEndereco) && oldEndereco != null )
			&& ( !"".equals(newEndereco) && newEndereco != null ) ) 
			atualizarEndereco( getEnderecoQNamed(oldEndereco), new Endereco(newEndereco) );
	}
    
    /* Precisa definir qual atribuito sera a chave a identificar
     * a tupla a ser alterada */

    public void atualizarEndereco(Endereco recuperar, Endereco alterar) {
        recuperar = retriveEndereco(recuperar);

        if (alterar.getEndereco() != null) {
            recuperar.setEndereco(alterar.getEndereco());
        }
        if (alterar.getComplemento() != null) {
            recuperar.setComplemento(alterar.getComplemento());
        }

        saveOrUpdatePojo(recuperar);
    }
    /*Artificio para Recuperar a Tupla de Endereco*/

    protected Endereco retriveEndereco(Endereco recuperar) {
        if (recuperar.getEnderecoId() == null) {
            return getEnderecoQNamed(recuperar.getEndereco());
        } else {
            return getEndereco(recuperar.getEnderecoId());
        }
    }

//	Consultas
    public Endereco getEndereco(Integer key) {
        return getPojoByID(Endereco.class, key);
    }

    public Endereco getEnderecoByQuery(String query, Object... params) {
        return getPojoByQry(query, params);
    }

    public Endereco getEnderecoQNamed(String fltrEndereco) {
        return getPojoByQNamed("Endereco.findByEndereco", fltrEndereco);
    }

    public Endereco getEnderecoQNamedComplemento(String fltrComplemento) {
        return getPojoByQNamed("Endereco.findByComplemento", fltrComplemento);
    }

    public List<Endereco> getEnderecos() {
        return (List<Endereco>) getALL(Endereco.class);
    }

    public List<Endereco> getEnderecosQNamedPRX(String fltrEndereco) {
        return getListByQNamedPRX("Endereco.findLikeByEndereco", fltrEndereco);
    }

    public List<Endereco> getEnderecosQNamedComplementoPRX(String fltrComplemento) {
        return getListByQNamedPRX("Endereco.findLikeByComplemento", fltrComplemento);
    }

    public List<Endereco> getEnderecosQNamedAllPRX(String fltrEndereco, String fltrLoteamento,
            String fltrComplemento, String fltrReferencia) {
        List<Endereco> itensEndereco = getEnderecosQNamedPRX(fltrEndereco);
        List<Endereco> itensComplemento = getEnderecosQNamedComplementoPRX(fltrComplemento);

        HashSet<Endereco> itens = new HashSet<Endereco>();

        itensEndereco.addAll(itensComplemento);
        itens.addAll(itensEndereco);
        itensEndereco.clear();

        itensEndereco.addAll(itens);
        return itensEndereco;
    }

    public List<Endereco> getEnderecosByQuery(String query, Object... params) {
        return getListByQry(query, params);
    }
	
	
}